package myjava.overloading;

public class Root1 {

   public static void main(String[] args) {

      Printer p = new Printer();
      SubPrinter sp = new SubPrinter();

      p.printIt(20);
      p.printIt("ciao", "universo");
      p.printIt(new Object());

      /* la decisione relativa a che overload usare avviene a compile time
         e dipende dal reference type dei parametri passati e non dalla loro vera natura */
      String s1 = new String("YO");
      Object s2 = new String("YO");
      // qui si passa una stringa e la JVM a compile time ha gia deciso quale overload usare
      sp.printIt(s1);
      // stesso qui ma lanciera' l'overload che usa Object
      sp.printIt(s2);
   }
}

/* to overload a method you MUST change the type and/or number of parameters!
    It's both an intra and extra class thing therefore methods are overloaded
    along the inheritance tree */

class Printer {

   public void printIt(int x) {
      int result = x + 5;
      System.out.println(result);
   }

   public void printIt(String x, String y) {
      String result = x + " -- " + y;
      System.out.println(result);
   }

   public void printIt(Object o) {
      System.out.println("Object - dad");
   }
}

class SubPrinter extends Printer {

   public void printIt(String s) {
      System.out.println("String - son");
   }
}
